﻿
namespace SistemaLogistica.DataAccess
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class TelefonoData : BaseDataAccess
    {
        private TelefonoData() { }

        private readonly static TelefonoData instancia = new TelefonoData();

        public static TelefonoData Instancia
        {
            get { return instancia; }
        }

        public List<Telefono> Listar()
        {
            List<Telefono> coleccion = new List<Telefono>();
            DbCommand cmd = db.GetStoredProcCommand("GetAllFromTelefono");
            using (IDataReader dr = db.ExecuteReader(cmd))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    Telefono telefono = new Telefono
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        UnidadMedidia = bien.UnidadMedidia,
                        Descripcion = bien.Descripcion,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroCelular = dr.GetString(dr.GetOrdinal("NroCelular")),
                        TipoCelular = dr.GetString(dr.GetOrdinal("TipoCelular"))
                    };
                    coleccion.Add(telefono);
                }
            }
            return coleccion;
        }

        public List<Telefono> Buscar(string numero)
        {
            List<Telefono> coleccion = new List<Telefono>();
            DbCommand cmd = db.GetStoredProcCommand("SearchTelefono");
            db.AddInParameter(cmd, "numero", DbType.String, numero);
            using (IDataReader dr = db.ExecuteReader(cmd))
            {
                while (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    Telefono telefono = new Telefono
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        UnidadMedidia = bien.UnidadMedidia,
                        Descripcion = bien.Descripcion,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroCelular = dr.GetString(dr.GetOrdinal("NroCelular")),
                        TipoCelular = dr.GetString(dr.GetOrdinal("TipoCelular"))
                    };
                    coleccion.Add(telefono);
                }
            }
            return coleccion;
        }

        public Telefono BuscarPorDescripcion(string descripcion)
        {
            Telefono telefono = null;
            DbCommand cmd = db.GetStoredProcCommand("GetTelefonoByDescription");
            db.AddInParameter(cmd, "descripcion", DbType.String, descripcion);
            using (IDataReader dr = db.ExecuteReader(cmd))
            {
                if (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    telefono = new Telefono
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        UnidadMedidia = bien.UnidadMedidia,
                        Descripcion = bien.Descripcion,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroCelular = dr.GetString(dr.GetOrdinal("NroCelular")),
                        TipoCelular = dr.GetString(dr.GetOrdinal("TipoCelular"))
                    };
                }
            }
            return telefono;
        }

        public Telefono ObtenerPorID(int idBien)
        {
            Telefono telefono = null;
            DbCommand cmd = db.GetStoredProcCommand("GetTelefonoByIdBien");
            db.AddInParameter(cmd, "idBien", DbType.String, idBien);
            using (IDataReader dr = db.ExecuteReader(cmd))
            {
                if (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    telefono = new Telefono
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        UnidadMedidia = bien.UnidadMedidia,
                        Descripcion = bien.Descripcion,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroCelular = dr.GetString(dr.GetOrdinal("NroCelular")),
                        TipoCelular = dr.GetString(dr.GetOrdinal("TipoCelular"))
                    };
                }
            }
            return telefono;
        }

        public Telefono ObtenerPorNumero(string numero)
        {
            Telefono telefono = null;
            DbCommand cmd = db.GetStoredProcCommand("GetTelefonoByNumero");
            db.AddInParameter(cmd, "numero", DbType.String, numero);
            using (IDataReader dr = db.ExecuteReader(cmd))
            {
                if (dr.Read())
                {
                    Bien bien = BienData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")));
                    telefono = new Telefono
                    {
                        Estado = bien.Estado,
                        Nombre = bien.Nombre,
                        Precio = bien.Precio,
                        StockActual = bien.StockActual,
                        StockMinimo = bien.StockMinimo,
                        UnidadMedidia = bien.UnidadMedidia,
                        Descripcion = bien.Descripcion,
                        IdBien = dr.GetInt32(dr.GetOrdinal("IdBien")),
                        Marca = dr.GetString(dr.GetOrdinal("Marca")),
                        Modelo = dr.GetString(dr.GetOrdinal("Modelo")),
                        NroCelular = dr.GetString(dr.GetOrdinal("NroCelular")),
                        TipoCelular = dr.GetString(dr.GetOrdinal("TipoCelular"))
                    };
                }
            }
            return telefono;
        }

        public bool Agregar(Telefono telefono)
        {
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        DbCommand cmdB = db.GetStoredProcCommand("InsertBien");
                        db.AddInParameter(cmdB, "descripcion", DbType.String, telefono.Descripcion);
                        db.AddInParameter(cmdB, "estado", DbType.Int32, telefono.Estado);
                        db.AddOutParameter(cmdB, "idBien", DbType.Int32, 11);
                        db.AddInParameter(cmdB, "idUnidadMedida", DbType.Int32, UnidadMedidiaData.Instancia.ObtenerMedidaBase().IdUnidadMedida);
                        db.AddInParameter(cmdB, "nombre", DbType.String, telefono.Nombre);
                        db.AddInParameter(cmdB, "precio", DbType.Currency, telefono.Precio);
                        db.AddInParameter(cmdB, "stockActual", DbType.Decimal, telefono.StockActual);
                        db.AddInParameter(cmdB, "stockMinimo", DbType.Decimal, telefono.StockMinimo);
                        int huboexito = db.ExecuteNonQuery(cmdB, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }

                        int idBien = int.Parse(db.GetParameterValue(cmdB, "idBien").ToString());

                        DbCommand cmdT = db.GetStoredProcCommand("InsertTelefono");
                        db.AddInParameter(cmdT, "idBien", DbType.Int32, idBien);
                        db.AddInParameter(cmdT, "marca", DbType.String, telefono.Marca);
                        db.AddInParameter(cmdT, "modelo", DbType.String, telefono.Modelo);
                        db.AddInParameter(cmdT, "nroCelular", DbType.String, telefono.NroCelular);
                        db.AddInParameter(cmdT, "tipoCelular", DbType.String, telefono.TipoCelular);
                        huboexito = db.ExecuteNonQuery(cmdT, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
            return true;
        }

        public bool Modificar(Telefono telefono)
        {
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        DbCommand cmdB = db.GetStoredProcCommand("UpdateBien");
                        db.AddInParameter(cmdB, "descripcion", DbType.String, telefono.Descripcion);
                        db.AddInParameter(cmdB, "estado", DbType.Int32, telefono.Estado);
                        db.AddInParameter(cmdB, "idBien", DbType.Int32, telefono.IdBien);
                        db.AddInParameter(cmdB, "idUnidadMedida", DbType.Int32, UnidadMedidiaData.Instancia.ObtenerMedidaBase().IdUnidadMedida);
                        db.AddInParameter(cmdB, "nombre", DbType.String, telefono.Nombre);
                        db.AddInParameter(cmdB, "precio", DbType.Currency, telefono.Precio);
                        db.AddInParameter(cmdB, "stockActual", DbType.Decimal, telefono.StockActual);
                        db.AddInParameter(cmdB, "stockMinimo", DbType.Decimal, telefono.StockMinimo);
                        int huboexito = db.ExecuteNonQuery(cmdB, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }

                        DbCommand cmdT = db.GetStoredProcCommand("UpdateTelefono");
                        db.AddInParameter(cmdT, "idBien", DbType.Int32, telefono.IdBien);
                        db.AddInParameter(cmdT, "marca", DbType.String, telefono.Marca);
                        db.AddInParameter(cmdT, "modelo", DbType.String, telefono.Modelo);
                        db.AddInParameter(cmdT, "nroCelular", DbType.String, telefono.NroCelular);
                        db.AddInParameter(cmdT, "tipoCelular", DbType.String, telefono.TipoCelular);
                        huboexito = db.ExecuteNonQuery(cmdT, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
            return true;
        }

        public bool Eliminar(int idBien)
        {
            using (DbConnection cnn = db.CreateConnection())
            {
                cnn.Open();
                using (DbTransaction tran = cnn.BeginTransaction())
                {
                    try
                    {
                        DbCommand cmdB = db.GetStoredProcCommand("DeleteBien");
                        db.AddInParameter(cmdB, "idBien", DbType.Int32, idBien);
                        int huboexito = db.ExecuteNonQuery(cmdB, tran);
                        if (huboexito == 0)
                        {
                            throw new Exception("Error");
                        }
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw new Exception(ex.Message);
                    }
                }
            }
            return true;
        }
    }
}
